import java.io.*;
import java.net.*;
import java.util.Scanner;

// UDP 版本的 回显客户端
public class UdpEchoClient {
    private DatagramSocket socket = null;
    private String serverIp = null;
    private int serverPort = 0;
    private int count = 0;

    // 一次通信, 需要有两个 ip, 两个端口.
    // 客户端的 ip 是 127.0.0.1 已知.
    // 客户端的 port 是系统自动分配的.
    // 服务器 ip 和 端口 也需要告诉客户端. 才能顺利把消息发个服务器.
    public UdpEchoClient(String serverIp, int serverPort) throws SocketException {
        socket = new DatagramSocket();
        this.serverIp = serverIp;
        this.serverPort = serverPort;
    }

    public void start() throws IOException {
        System.out.println("客户端启动!");
        while (true) {
            // 1. 从控制台读取要发送的数据
            int a = 0;
            try(Reader reader = new FileReader("D:/有品.webp")) {
                while(true) {
                    int n = 0;
                    StringBuilder builder = new StringBuilder();
                    int i = 0;
                    for( i = 0; i < 1024; i++) {
                        int b = reader.read();
                        n = b;
                        if (b == -1) {
                            break;
                        }
                        builder.append((char)b);
                    }
                    String request = builder.toString();
                    if(n == -1) {
                        request = "-1";
                    }
                    count += i;
                    System.out.println("发送序号为：" + count);
                    Boolean qr = true;
                        // 2. 构造成 UDP 请求, 并发送
                        //    构造这个 Packet 的时候, 需要把 serverIp 和 port 都传入过来. 但是此处 IP 地址需要填写的是一个 32位的整数形式.
                        //    上述的 IP 地址是一个字符串. 需要使用 InetAddress.getByName 来进行一个转换.
                        DatagramPacket requestPacket = new DatagramPacket(request.getBytes(), request.getBytes().length,
                                InetAddress.getByName(serverIp), serverPort);
                    while (qr) {
                        socket.send(requestPacket);
                        // 3. 读取服务器的 UDP 响应, 并解析
                        DatagramPacket responsePacket = new DatagramPacket(new byte[i], i);
                        socket.receive(responsePacket);

                        String response = new String(responsePacket.getData(), 0, responsePacket.getLength());
                        // 4. 把解析好的结果显示出来.
                        int tmp = Integer.parseInt(response);
                        if (tmp == count + 1) {
                            qr = false;
                            System.out.println("确认序号为："+ tmp);
                            if(n == -1) {
                                System.out.println("发送完毕");
                                break;
                            }
                        }
                        if(n == -1) {
                            break;
                        }
                    }
                }
            }
        }
    }

    public static void main(String[] args) throws IOException {
        UdpEchoClient client = new UdpEchoClient("127.0.0.1", 9090);
        client.start();
    }
}

